package CONTABILIDAD_MODELO;

import Conexion.Conexion;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.util.ArrayList;

import java.util.List;
import java.util.StringTokenizer;

public class CON_CIERRE {

    private Double ID;
    private Double ID_CENTRO_COSTO;
    private Double ID_CUENTA_CONTABLE;
    private Double DEBE;
    private Double HABER;
    private Double DEBE_TC;
    private Double HABER_TC;
    private Double ID_FECHA_CIERRE;
    private Conexion con = null;

    public CON_CIERRE() {
    }

    public CON_CIERRE(Double ID, Double ID_CENTRO_COSTO, Double ID_CUENTA_CONTABLE, Double DEBE, Double HABER, Double DEBE_TC, Double HABER_TC, Double ID_FECHA_CIERRE) {
        this.ID = ID;
        this.ID_CENTRO_COSTO = ID_CENTRO_COSTO;
        this.ID_CUENTA_CONTABLE = ID_CUENTA_CONTABLE;
        this.DEBE = DEBE;
        this.DEBE_TC = DEBE_TC;
        this.HABER_TC = HABER_TC;
        this.HABER = HABER;        
        this.ID_FECHA_CIERRE = ID_FECHA_CIERRE;
    }

    public boolean Insertar() {
        try {
            String cc = "null";
            if(ID_CENTRO_COSTO!=0.0)
                cc = ID_CENTRO_COSTO+"";
            
            String consulta = "insert into BROKER.CON_CIERRE(ID, ID_CENTRO_COSTO, ID_CUENTA_CONTABLE, DEBE, HABER, DEBE_TC, HABER_TC, ID_FECHA_CIERRE) VALUES (" + ID + "," + cc + "," + ID_CUENTA_CONTABLE + "," + DEBE + "," + HABER + ","+DEBE_TC+", "+HABER_TC+"," + ID_FECHA_CIERRE + ")";
            con.EjecutarSentencia(consulta);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public int getCantidadxTipo(double tipo,int mes, int ano) throws SQLException
    {
        String consulta = "SELECT COUNT(CON_COMPROBANTE.ID) as CANTIDAD\n"+
                          "FROM BROKER.CON_COMPROBANTE\n"+
                          "WHERE (CON_COMPROBANTE.TIPO = '"+tipo+"') AND (CON_COMPROBANTE.ESTADO_RECURRENTE = 0)\n"+
                          "AND (CON_COMPROBANTE.ESTADO_ANULADO = 0) AND (CON_COMPROBANTE.CODIGO like('%-"+mes+"-"+ano+"'))";
        ResultSet rs = con.EjecutarConsulta(consulta);
        rs.next();
        return rs.getInt("CANTIDAD");
    }
    
    public int getTransaccionesxTipo(double tipo,int mes, int ano) throws SQLException
    {
        String consulta =   "SELECT COUNT (CON_CUENTA_COMPROBANTE.ID_CUENTA) CANTIDAD\n" +
                            "FROM BROKER.CON_COMPROBANTE, BROKER.CON_CUENTA_COMPROBANTE\n" +
                            "WHERE (CON_CUENTA_COMPROBANTE.ID_COMPROBANTE = CON_COMPROBANTE.ID)\n" +
                            "AND (CON_COMPROBANTE.TIPO = '"+tipo+"')\n" +
                            "AND (CON_COMPROBANTE.ESTADO_RECURRENTE = 0)\n" +
                            "AND (CON_COMPROBANTE.ESTADO_ANULADO = 0)\n" +
                            "AND (CON_COMPROBANTE.CODIGO like('%-"+mes+"-"+ano+"'))";
        ResultSet rs = con.EjecutarConsulta(consulta);
        rs.next();
        return rs.getInt("CANTIDAD");
    }
    double debe=0.0;
    double haber =0.0;
    public void generarCalculoDEBE_HABER(double tipo,int mes, int ano) throws SQLException
    {
        String consulta =  "SELECT \n"+ 
                            "sum(CASE \n" + 
                            "WHEN uno =0   THEN DEBE_TC\n" +        
                            " ELSE  DEBE_F\n" +
                            "end) as debe,\n" +
                            "sum(CASE \n" +
                            " WHEN uno =0   THEN haber_TC   \n" +     
                            " ELSE  haber_F\n" +
                            "end) as haber\n" +
                            "      FROM BROKER.CON_CIERRE_MENSUAL\n" +
                            "      WHERE CODIGO LIKE ('%-"+mes+"-"+ano+"')\n" +
                            "        AND TIPO = '"+tipo+"'";
        ResultSet rs = con.EjecutarConsulta(consulta);
        rs.next();
        debe = rs.getDouble("debe");
        haber = rs.getDouble("haber");
    }
    
    public double getCalculoHABER() throws SQLException
    {
        return haber;
    }
    public double getCalculoDEBE() throws SQLException
    {
        return debe;
    }
    
    public double getCalculoTIPO(String tipo, int mes, int ano) throws SQLException
    {
        String consulta1 = "SELECT to_char(lpad(cc.CODIGO,1)) as num FROM BROKER.CON_CUENTA_CONTABLE cc WHERE (cc.DESCRIPCION = '"+tipo+"') AND CODIGO_NIVEL_CUENTA=1";
        ResultSet rss = con.EjecutarConsulta(consulta1);
        rss.next();
        String numero = rss.getString("num");
                        
        String consulta =   "SELECT  sum(CON_CUENTA_COMPROBANTE.DEBE_tc) as debe_bs,\n" +
                            "sum(CON_CUENTA_COMPROBANTE.HABER_tc)as haber_bs\n" +
                            "FROM \n" +
                            "BROKER.CON_CUENTA_CONTABLE,\n" +
                            "BROKER.CON_COMPROBANTE,\n" +
                            "BROKER.CON_CUENTA_COMPROBANTE,\n" +
                            "BROKER.CON_MONEDA\n" +
                            "WHERE (CON_CUENTA_COMPROBANTE.ID_CUENTA = CON_CUENTA_CONTABLE.ID)\n" +
                            "AND (CON_CUENTA_COMPROBANTE.ID_COMPROBANTE = CON_COMPROBANTE.ID)\n" +
                            "AND (CON_CUENTA_CONTABLE.ID_MONEDA = CON_MONEDA.ID)\n" +
                            "AND (CON_COMPROBANTE.ESTADO_ANULADO = 0)\n" +
                            "AND (CON_COMPROBANTE.ESTADO_RECURRENTE = 0)\n" +
                            "AND (CON_COMPROBANTE.CODIGO LIKE '%-"+mes+"-"+ano+"')\n" +
                            "AND (CON_CUENTA_CONTABLE.CODIGO LIKE '"+numero+"%' )";
        ResultSet rs = con.EjecutarConsulta(consulta);
        rs.next();
        double debe_bs = rs.getDouble("debe_bs");
        double haber_bs = rs.getDouble("haber_bs");
        
        return haber_bs-debe_bs;
    }   
    
    public boolean EliminarCierre(int mes, int ano) throws SQLException
    {
        String eliminar_cierre ="delete FROM BROKER.CON_CIERRE where ID_FECHA_CIERRE in (SELECT ID FROM BROKER.CON_FECHA_CIERRE WHERE  (CON_FECHA_CIERRE.MES >= "+mes+") AND (CON_FECHA_CIERRE.ANO >= "+ano+"))";
        con.EjecutarSentencia(eliminar_cierre);
        return true;
    }
    
    public boolean generarCierre() throws SQLException
    {
        CON_FECHA_CIERRE fechac = new CON_FECHA_CIERRE();
        fechac.setCon(con);
        
        int mes=fechac.mesActual();
        int ano=fechac.anoActual();                                        
        
        
        String consulta1 = "SELECT CON_CUENTA_CONTABLE.ID AS ID_CUENTA,\n" +
                            "CON_CENTRO_COSTO.ID AS ID_CENTRO_COSTO, \n" +
                            "SUM(CON_CUENTA_COMPROBANTE.DEBE) AS DEBE,\n" +
                            "SUM(CON_CUENTA_COMPROBANTE.HABER) AS HABER,\n" +
                            "SUM(CON_CUENTA_COMPROBANTE.DEBE_TC) AS DEBE_TC,\n" +
                            "SUM(CON_CUENTA_COMPROBANTE.HABER_TC) AS HABER_TC\n" +
                            "FROM BROKER.CON_CUENTA_CONTABLE,\n" +
                            "BROKER.CON_CUENTA_COMPROBANTE,\n" +
                            "BROKER.CON_MONEDA,\n" +
                            "BROKER.CON_CENTRO_COSTO,\n" +
                            "BROKER.CON_COMPROBANTE\n" +
                            "WHERE (CON_CUENTA_COMPROBANTE.ID_CUENTA = CON_CUENTA_CONTABLE.ID)\n" +
                            "AND (CON_CUENTA_CONTABLE.ID_MONEDA = CON_MONEDA.ID)\n" +
                            "AND (CON_CUENTA_COMPROBANTE.ID_COMPROBANTE = CON_COMPROBANTE.ID)\n" +
                            "AND (CON_CUENTA_COMPROBANTE.ID_CENTRO_COSTO = CON_CENTRO_COSTO.ID(+))\n" +
                            "AND (CON_COMPROBANTE.CODIGO LIKE '%-"+mes+"-"+ano+"')\n" +
                            "AND (CON_COMPROBANTE.ESTADO_RECURRENTE = 0)\n" +
                            "AND (CON_COMPROBANTE.ESTADO_ANULADO = 0)\n" +
                            "GROUP BY\n" +
                            "CON_CUENTA_CONTABLE.ID,\n" +
                            "CON_CENTRO_COSTO.ID";
        
        ResultSet rss = con.EjecutarConsulta(consulta1);
        
        fechac.generar_CIERRE(ano,mes);
        fechac = fechac.Buscar(mes, ano);       
        
        EliminarCierre(mes, ano);
        
        while(rss.next())
        {
            CON_CIERRE cierre = new CON_CIERRE(0.0, rss.getDouble("ID_CENTRO_COSTO"), rss.getDouble("ID_CUENTA"), rss.getDouble("DEBE"), rss.getDouble("HABER"), rss.getDouble("DEBE_TC"), rss.getDouble("HABER_TC"), fechac.getID());
            cierre.setCon(con);
            cierre.Insertar();
        }
        
        CON_MONEDA moneda= new CON_MONEDA();
        moneda.setCon(con);
        List<CON_MONEDA> lista = moneda.Todos();
        
        
        
        for (int i = 0; i < lista.size(); i++) {
            CON_TC_CIERRE tc =null;
            if(lista.get(i).getMONEDA_BASE()==1)
                tc = new CON_TC_CIERRE(fechac.getID(), lista.get(i).getID(), lista.get(i).getTIPO_DE_CAMBIO_VENTA());
            else
                tc = new CON_TC_CIERRE(fechac.getID(), lista.get(i).getID(), lista.get(i).getTIPO_DE_CAMBIO());
            
            tc.setCon(con);
            tc.Insertar();
        }
        
        return true;
    }       
    
    
    public boolean EliminarXid() {
        try {
            String consulta = "delete from BROKER.CON_CIERRE where ID= " + getID();
            con.EjecutarSentencia(consulta);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public List<CON_CIERRE> Todos() {
        try {
            String consulta = "select * from BROKER.CON_CIERRE";
            ResultSet rs = con.EjecutarConsulta(consulta);
            return Cargar(rs);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public List<CON_CIERRE> Cargar(ResultSet rs) {
        try {
            List<CON_CIERRE> lista = new ArrayList<CON_CIERRE>();
            while (rs.next()) {
                CON_CIERRE objeto = new CON_CIERRE();
                objeto.setID(rs.getDouble("ID"));
                objeto.setID_CENTRO_COSTO(rs.getDouble("ID_CENTRO_COSTO"));
                objeto.setID_CUENTA_CONTABLE(rs.getDouble("ID_CUENTA_CONTABLE"));
                objeto.setDEBE(rs.getDouble("DEBE"));
                objeto.setDEBE_TC(rs.getDouble("DEBE_TC"));
                objeto.setHABER_TC(rs.getDouble("HABER_TC"));
                objeto.setHABER(rs.getDouble("HABER"));
                objeto.setID_FECHA_CIERRE(rs.getDouble("ID_FECHA_CIERRE"));
                objeto.setCon(con);
                lista.add(objeto);
            }
            return lista;
        } catch (SQLException ex) {
            ex.printStackTrace();
            return null;
        }
    }

    public Double getID() {
        return ID;
    }

    public void setID(Double ID) {
        this.ID = ID;
    }

    public Double getID_CENTRO_COSTO() {
        return ID_CENTRO_COSTO;
    }

    public void setID_CENTRO_COSTO(Double ID_CENTRO_COSTO) {
        this.ID_CENTRO_COSTO = ID_CENTRO_COSTO;
    }

    public Double getID_CUENTA_CONTABLE() {
        return ID_CUENTA_CONTABLE;
    }

    public void setID_CUENTA_CONTABLE(Double ID_CUENTA_CONTABLE) {
        this.ID_CUENTA_CONTABLE = ID_CUENTA_CONTABLE;
    }

    public Double getDEBE() {
        return DEBE;
    }

    public void setDEBE(Double DEBE) {
        this.DEBE = DEBE;
    }

    public Double getHABER() {
        return HABER;
    }

    public void setHABER(Double HABER) {
        this.HABER = HABER;
    }

    public Double getDEBE_TC() {
        return DEBE_TC;
    }

    public void setDEBE_TC(Double DEBE_TC) {
        this.DEBE_TC = DEBE_TC;
    }

    public Double getHABER_TC() {
        return HABER_TC;
    }

    public void setHABER_TC(Double HABER_TC) {
        this.HABER_TC = HABER_TC;
    }

    public Double getID_FECHA_CIERRE() {
        return ID_FECHA_CIERRE;
    }

    public void setID_FECHA_CIERRE(Double ID_FECHA_CIERRE) {
        this.ID_FECHA_CIERRE = ID_FECHA_CIERRE;
    }

    public Conexion getCon() {
        return con;
    }

    public void setCon(Conexion con) {
        this.con = con;
    }
}
